import { onMounted, ref } from 'vue'
import { useIntersectionObserver, useIntervalFn } from '@vueuse/core'
import dayjs from 'dayjs'

/**
 * 数据懒加载函数
 * @param { Function } apiFn 请求API函数
 * @returns { Object } { result: 请求结果, target: 被检测元素 }
 */

export const useLazyData = (apiFn) => {
  // 准备响应式数据
  const result = ref([])

  // 配合标签的 ref 属性使用
  const target = ref(null)

  // stop 是一个函数，用于停止检测元素可见性
  const { stop } = useIntersectionObserver(
    target,
    // isIntersecting 布尔值，元素可见为 true，元素不可见为 false
    ([{ isIntersecting }], observerElement) => {
      // console.log('目标元素的可见性', isIntersecting)
      // 如果目标可见，发送请求
      if (isIntersecting) {
        // console.log('可以发送请求了，发送一次请求即可')
        // 获取请求，更新响应式数据
        apiFn().then(res => {
          result.value = res.result
        })
        // 主动停止检测元素可见性
        stop()
      }
    })

  // 响应式数据给模板使用
  //   result    请求结果
  //   target    被检测元素
  return { result, target }
}

/**
 * 支付倒计时函数
 */

export const usePayTime = () => {
  const time = ref(0)
  const timeText = ref('')

  const { pause, resume } = useIntervalFn(() => {
    // 定时减少 1 秒
    time.value--
    // 格式化变成 mm分ss秒，用于展示
    timeText.value = dayjs.unix(time.value).format('mm分ss秒')
    // 倒计时结束
    if (time.value <= 0) {
      timeText.value = '已经超时'
      // 清除定时器
      pause()
    }
  }, 1000, { immediate: true })

  // 组件销毁时，也要清理 window 中定时器
  onMounted(() => {
    pause()
  })

  // 开启定时器 countdown 倒计时时间
  const start = (countdown) => {
    // 避免第一秒等待期的空白
    time.value = countdown
    timeText.value = dayjs.unix(time.value).format('mm分ss秒')
    // 调用定时器
    resume()
  }

  return {
    // 用于启动定时器的函数
    start,
    // 用于在页面中展示的文字
    timeText
  }
}
